package algj.compilador.arvoresintatica;

import algj.compilador.GramaticaAlgJ;
import algj.compilador.GramaticaAlgJTreeConstants;
import algj.compilador.Node;
import algj.compilador.Token;

/**
 * Nó Modelo para as demais estruturas da árvore sintática
 * @author Laerte M. Rodrigues <laertemateus@gmail.com>
 * @version $Rev: 9 $
 */
public abstract class ASTno implements Node {

	protected Node parent;
	protected Node[] children;
	protected int id;
	protected Object value;
	protected GramaticaAlgJ parser;
	protected Token firstToken;
	protected Token lastToken;

	/*** CÓDIGO COPIADO DA CLASSE BASE SIMPLENODE DO JAVACC ***/
	
	public ASTno(int i) {
		id = i;
	}

	public ASTno(GramaticaAlgJ p, int i) {
		this(i);
		parser = p;
	}

	public void jjtOpen() {
	}

	public void jjtClose() {
	}

	public void jjtSetParent(Node n) {
		parent = n;
	}

	public Node jjtGetParent() {
		return parent;
	}

	public void jjtAddChild(Node n, int i) {
		if (children == null) {
			children = new Node[i + 1];
		} else if (i >= children.length) {
			Node c[] = new Node[i + 1];
			System.arraycopy(children, 0, c, 0, children.length);
			children = c;
		}
		children[i] = n;
	}

	public Node jjtGetChild(int i) {
		return children[i];
	}

	public int jjtGetNumChildren() {
		return (children == null) ? 0 : children.length;
	}

	public void jjtSetValue(Object value) {
		this.value = value;
	}

	public Object jjtGetValue() {
		return value;
	}

	public Token jjtGetFirstToken() {
		return firstToken;
	}

	public void jjtSetFirstToken(Token token) {
		this.firstToken = token;
	}

	public Token jjtGetLastToken() {
		return lastToken;
	}

	public void jjtSetLastToken(Token token) {
		this.lastToken = token;
	}

	/*
	 * You can override these two methods in subclasses of SimpleNode to
	 * customize the way the node appears when the tree is dumped. If your
	 * output uses more than one line you should override toString(String),
	 * otherwise overriding toString() is probably all you need to do.
	 */

	public String toString() {
		return GramaticaAlgJTreeConstants.jjtNodeName[id];
	}

	public String toString(String prefix) {
		return prefix + toString();
	}

	/*
	 * Override this method if you want to customize how the node dumps out its
	 * children.
	 */
	public void dump(String prefix) {
		System.out.println(prefix+this);
		if (children != null) {
			for (int i = 0; i < children.length; ++i) {
				ASTno n = (ASTno) children[i];
				if (n != null) {
					n.dump("\t"+prefix);
				}
			}
		}
	}

	/*** FIM DO CÓDIGO COPIADO DA CLASSE BASE SIMPLENODE DO JAVACC ***/
	
	/**
	 * Valida a semântica do nó
	 * @thorws Exception Erro semântico do nó
	 */
	public void validarSemantica() throws Exception {
		throw new UnsupportedOperationException();
	}
}
